package models

type Block struct {
	Id              uint64 `json:"id"               xorm:"notnull pk autoincr BigInt comment('id')"`
	Number          string `json:"number"           xorm:"notnull index Varchar(255) comment('区块编号')"`
	Hash            string `json:"block_hash"            xorm:"notnull index Varchar(255) comment('区块hash')"`
	ParentHash      string `json:"parent_hash"      xorm:"notnull Varchar(255) comment('前区块hash')"`
	Nonce           string `json:"nonce"           xorm:"notnull Varchar(255) comment('随机值')"`
	TxHash          string `json:"transactions_root" xorm:"notnull Varchar(255) comment('交易根hash')"`
	Coinbase        string `json:"miner"           xorm:"notnull Varchar(255) comment('矿工地址')"`
	Root            string `json:"state_root"       xorm:"notnull Varchar(255) comment('状态根hash')"`
	Bloom           string `json:"logs_bloom"       xorm:"notnull Text comment('bloom过滤器')"`
	Difficulty      string `json:"difficulty"      xorm:"notnull Varchar(255) comment('本区块难度值')"`
	GasLimit        string `json:"gas_limit"        xorm:"notnull Varchar(255) comment('gas限额')"`
	GasUsed         string `json:"gas_used"         xorm:"notnull Varchar(255) comment('gas消耗')"`
	ReceiptHash     string `json:"receipts_root"    xorm:"notnull Varchar(255) comment('收据的根hash')"`
	Time            string `json:"timestamp"       xorm:"notnull Varchar(255) comment('时间戳')"`
	Extra           string `json:"extra_data"       xorm:"notnull Text comment('区块附加数据')"`
	UncleHash       string `json:"sha3Uncles"      xorm:"notnull Varchar(255) comment('叔块列表hash')"`
	MixDigest       string `json:"mix_hash"         xorm:"notnull Varchar(255) comment('计算证明hash')"`
	TotalDifficulty string `json:"total_difficulty" xorm:"notnull Varchar(255) comment('整体难度值')"`
	Size            string `json:"size"            xorm:"notnull Varchar(255) comment('大小')"`
	TxNu            int    `json:"tx_nu"           xorm:"Int comment('交易个数')"`
	NodeName        string `json:"node_name" xorm:"notnull Varchar(255) comment('节点名称')"`
}

type BlockIndex struct {
	Id       uint64 `json:"id"        xorm:"notnull pk autoincr BigInt comment('id')"`
	Number   string `json:"number"    xorm:"notnull index Varchar(255) comment('区块编号')"`
	Hash     string `json:"block_hash" xorm:"notnull index unique VARCHAR(255) comment('交易hash')"`
	TxNu     int    `json:"tx_nu"     xorm:"Int comment('交易个数')"`
	Time     string `json:"timestamp" xorm:"notnull Varchar(255) comment('时间戳')"`
	GasLimit string `json:"gas_limit" xorm:"notnull Varchar(255) comment('gas限额')"`
	GasUsed  string `json:"gas_used"  xorm:"notnull Varchar(255) comment('gas消耗')"`
	Miner    string `json:"miner"     xorm:"notnull Varchar(255) comment('节点地址')"`
	NodeName string `json:"node_name" xorm:"notnull Varchar(255) comment('节点名称')"`
}

type BlockIndexList []BlockIndex

func (list BlockIndexList) Miners() []string {
	temp := make([]string, 0, len(list))
	for _, v := range list {
		temp = append(temp, v.Miner)
	}

	//去重
	result := make([]string, 0)
	tempMap := map[string]byte{} // 存放不重复主键
	for _, e := range temp {
		l := len(tempMap)
		tempMap[e] = 0
		if len(tempMap) != l { // 加入map后，map长度变化，则元素不重复
			result = append(result, e)
		}
	}

	return result
}

type BlockWitchTransactions struct {
	Block
	Transactions []*Transaction
}
